package spese.gestore.androidiani;

import java.io.File;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.KeyEvent;
import android.view.View;
import android.view.MenuInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.database.Cursor;

/**
 * Questa classe estende Activity e gestisce quella che che è la view della
 * lista delle missioni presenti sul telefono
 * 
 * @author Fusinato Lorenzo - Gruppo Androidiani 
 */

public class Lista_Missioni extends Activity {

	ListView MissioniLv;
	public ListViewDb listdb;
	public Cursor c;
	public MissioniDb db;
	public ValuteDb valutedb;
	public SpeseDb sdb;
	public SpinnerDb spdb;

	public void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);

		// Settare il layout principale della pagina
		setContentView(R.layout.layout_lista_missioni);

		// Associo alla list view il suo id nel layout
		MissioniLv = (ListView) findViewById(R.id.lV_missioni);

		// Il register serve per far si che se premo sulla List View capisce che
		// deve fare qualcosa
		registerForContextMenu(MissioniLv);

		// Apriamo il db creato tramite MissioniDb a cui passo il contesto della
		// classe attuale ovvero Lista_Missioni
		db = new MissioniDb(getApplicationContext());
		valutedb = new ValuteDb(getApplicationContext());
		sdb = new SpeseDb(getApplicationContext());
		listdb = new ListViewDb(getApplicationContext());
		spdb = new SpinnerDb(getApplicationContext());

		// Apriamo i DB
		listdb.open();
		db.open();
		valutedb.open();
		sdb.open();
		spdb.open();

		if (listdb.fetchListView().getCount() == 0) {
			popolaListViewDB();
		}

		if (valutedb.fetchValute().getCount() == 0) {
			popolaValuteDB();
		}

		// Resetto ListViewDb
		reset_list_view_db();
		
		// Controllo se il file esiste. Se non esiste vuol dire che è la prima
		// volta che si accende l'app oppure che i dati
		// mancano quindi ti chiede di inserirli. lo fa spedendoti alla classe
		// Presa_dati tramite un intente esplicito
		File f = new File(getFilesDir() + File.separator + "dati_utente.txt");

		if (f.exists() == false) {
			Intent intent_send_presa_dati = new Intent(Lista_Missioni.this,
					Presa_dati.class);
			startActivity(intent_send_presa_dati);
		}

		if (spdb.fetchSPINNER().getCount() == 0) {// inserimento dati, solo se
													// il db è vuoto

			spdb.insertSpinner("Airplane");
			spdb.insertSpinner("Train");
			spdb.insertSpinner("Bus");
			spdb.insertSpinner("Taxi");
			spdb.insertSpinner("Hotel");
			spdb.insertSpinner("Food");
			spdb.insertSpinner("Logging");

		}

		// Chiamo la Query che in questo caso è un all
		c = db.fetchMissions();

		// Comincio a fare il management del cursore
		startManagingCursor(c);

		// Semplice cursor adapter
		SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, // Contesto
				R.layout.layout_list_missioni, // il layout di ogni
												// riga/prodotto
				c, // Il cursore
				new String[] { MissioniDb.MissionMetaData.MISSION_NAME_KEY,
						MissioniDb.MissionMetaData.MISSION_PLACE_KEY,
						MissioniDb.MissionMetaData.MISSION_SDATE_KEY,
						MissioniDb.MissionMetaData.MISSION_EDATE_KEY },// questi
																		// colonne
				new int[] { R.id.MissionHeader, R.id.MissionPlace,
						R.id.tV_sDate, R.id.tV_eDate });// in queste views

		stopManagingCursor(c);

		// Ora la list view si prende questo adapter appena creato sopra
		MissioniLv.setAdapter(adapter);

		MissioniLv.setOnItemClickListener(new OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View v,
					int position, long id) {

				// Chiudo il db perchè ho finito di riempire la mia list view
				Intent intent_2 = new Intent(Lista_Missioni.this,
						Lista_Spese.class);
				String confr = Long.toString(id);
				intent_2.putExtra("riga missione", confr);
				System.out.println("on touch id= " + confr);
				startActivity(intent_2);

			}
		});

		listdb.close();
		db.close();
		valutedb.close();
		sdb.close();
		spdb.close();
		
	}

	/**
	 * Quando sul telefono viene premuto il tasto return viene distrutta la
	 * istanza salvata e inviato un null che fa ricaricare il tutto
	 * 
	 * @see android.app.Activity#onResume()
	 */
	public void onResume() {
		onCreate(null);
	}

	/**
	 * Codice per creare il menu che prende il menu della pagina e lo "inflate"
	 * con R.id.list_mission_menu
	 * 
	 * @see android.app.Activity#onCreateOptionsMenu(android.view.Menu)
	 */
	public boolean onCreateOptionsMenu(Menu menu) {

		MenuInflater inflater = getMenuInflater();

		inflater.inflate(R.layout.list_mission_menu, menu);

		return true;
	}

	/**
	 * Ascoltatore per agire in base a cosa viene premuto dall'utente sul menu
	 * appena apparso
	 * 
	 * @see android.app.Activity#onOptionsItemSelected(android.view.MenuItem)
	 */
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.new_mission:
			new_Mission();
			break;

		case R.id.Options:
			Option();
			break;
		}
		return true;
	}

	/**
	 * Questo metodo serve al menu per chiamare la classe "Nuova_Missione"
	 * tramite un Intent, dopo la pressione tramite touch da parte dell'utente.
	 */
	public void new_Mission() {
		// Chiudo il db perchè ho finito di riempire la mia list view

		listdb.close();
		db.close();
		valutedb.close();
		sdb.close();
		spdb.close();
		Intent intent_new_mission = new Intent(Lista_Missioni.this,
				Nuova_Missione.class);
		intent_new_mission.putExtra("Bool", "a");
		startActivity(intent_new_mission);
	}

	/**
	 * Questo metodo serve al menu per chiamare la classe "Presa_dati" tramite
	 * un Intent, dopo la pressione tramite touch da parte dell'utente.
	 */
	public void Option() {
		// Chiudo il db perchè ho finito di riempire la mia list view

		listdb.close();
		db.close();
		valutedb.close();
		sdb.close();
		spdb.close();
		Intent intent_option = new Intent(Lista_Missioni.this,
				Menu_Opzioni.class);
		startActivity(intent_option);
	}

	/**
	 * Questo metodo serve per creare il menu contestuale che si avvierà dopo un
	 * long touch su di un elemento della list view
	 * 
	 * @see android.app.Activity#onCreateContextMenu(android.view.ContextMenu,
	 *      android.view.View, android.view.ContextMenu.ContextMenuInfo)
	 */
	@Override
	public void onCreateContextMenu(ContextMenu menu, View v,
			ContextMenuInfo menuInfo) {

		super.onCreateContextMenu(menu, v, menuInfo);

		menu.setHeaderTitle("Options"); // Titolo del menu contestuale
		menu.add(0, v.getId(), 0, "Edit"); // Aggiungo le varie opzioni che
											// potranno comparire nel menu
		menu.add(0, v.getId(), 0, "View");
		menu.add(0, v.getId(), 0, "Delete");
		menu.add(0, v.getId(), 0, "CSV");

	}

	/**
	 * Questo metodo serve per capire cosa fare quando viene premuta un'opzione
	 * del menu contestuale
	 * 
	 * @see android.app.Activity#onContextItemSelected(android.view.MenuItem)
	 */
	@Override
	public boolean onContextItemSelected(MenuItem item) {

		// Prendo le info della riga appena cliccata con il long touch
		AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
				.getMenuInfo();

		// Associo ad un long l'id della riga su cui è stato fatto il long touch
		final long examId = info.id;

		// Converto il long in una stringa per poi poterla usare
		String confr = Long.toString(examId);

		// Ciclo di if per vedere cosa ho premuto nel menu contestuale
		if (item.getTitle() == "Edit") {
			listdb.close();
			db.close();
			valutedb.close();
			sdb.close();
			spdb.close();
			Intent intent_1 = new Intent(Lista_Missioni.this,
					Nuova_Missione.class);
			intent_1.putExtra("Bool", confr);
			startActivity(intent_1);
		}

		else if (item.getTitle() == "View") {
			listdb.close();
			db.close();
			valutedb.close();
			sdb.close();
			spdb.close();
			Intent intent_2 = new Intent(Lista_Missioni.this, Lista_Spese.class);
			intent_2.putExtra("riga missione", confr);
			System.out.println("on long touch id= " + confr);
			startActivity(intent_2);
		}

		else if (item.getTitle() == "Delete") {
			delete_row(confr);
		}
		
		else if (item.getTitle() == "CSV") {
			listdb.close();
			db.close();
			valutedb.close();
			sdb.close();
			spdb.close();
			Intent intent_4 = new Intent(Lista_Missioni.this, CSV.class);
			intent_4.putExtra("riga missione", confr);
			System.out.println("on long touch id= " + confr);
			startActivity(intent_4);
		}

		else {
			return false;
		} // Ritorna falso se l'utente preme da altre parti

		return true;
	}

	/**
	 * Dopo il click lungo, se viene scelto il delete con questo metodo di
	 * mostra un alert con il quale si richiede la conferma. Si passa la stringa
	 * "confr", ovvero il numero id della riga appena cliccata nella list view
	 * 
	 * @param confr
	 */
	public void delete_row(final String confr) {

		// Creo l'alert Dialog
		AlertDialog.Builder miaAlert = new AlertDialog.Builder(this);

		// Setto il titolo del mio alert
		miaAlert.setTitle("Delete");

		// Setto il messaggio che dovrà comparire sotto l'alert
		miaAlert.setMessage("Will also delete the data related to the mission. Continue?");

		//
		miaAlert.setCancelable(false);

		// Setto l'azione da intraprendere quando viene dato l'ok dall'utente
		miaAlert.setPositiveButton("Yes",
				new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int id) {

						/*Qui inserire il delete della directory della missione per eliminare di conseguenza
						 * tutti i dati connessi ovvero foto e csv*/
						
						db.delete(confr);
						sdb.delete_rows_by_miss(confr);

						c.requery();

					}
				});

		// Setto l'azione da intraprendere quando viene dato il "no" dall'utente
		miaAlert.setNegativeButton("Cancel",
				new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int id) {
						return;
					}
				});

		// Ora istanzio il mio alert
		AlertDialog alert = miaAlert.create();

		// Ora visualizzo il mio alert appena istanziato
		alert.show();

	}

	/**
	 * Con questo metodo impongo al device che al tasto "back" parta un alert
	 * dialog x chiedere la conferma della chiusura del programma
	 */
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if ((keyCode == KeyEvent.KEYCODE_BACK)) {

			return false;
		}
		return super.onKeyDown(keyCode, event);
	}

	/**
	 * Resetto il ListViewDb
	 */
	public void reset_list_view_db() {

		listdb.update("1", "Insert Mission", "ex: Engeenering Meeting", "1");
		listdb.update("2", "Insert Place", "ex: Berlino", "1");
		listdb.update("3", "Insert Start Date", "", "1");
		listdb.update("4", "Insert End Date", "", "1");

	}

	/**
	 * Popolo il ListViewDb quando esso è vuoto
	 */
	public void popolaListViewDB() {

		listdb.insertListView("Insert Mission", "ex: Engeenering Meeting", "1");
		listdb.insertListView("Insert Place", "ex: Berlino", "1");
		listdb.insertListView("Insert Start Date", "ex: 20/04/2012", "1");
		listdb.insertListView("Insert End Date", "ex: 21/05/2012", "1");
		listdb.insertListView("Place", "ex:Berlino", "2");
		listdb.insertListView("Insert Date", "", "2");
		listdb.insertListView("Category", "", "2");
		listdb.insertListView("Description", "", "2");
		listdb.insertListView("Valuta", "", "2");
		listdb.insertListView("Person", "1", "2");
		listdb.insertListView("Price", "", "2");
		listdb.insertListView("Photo", "", "2");
		listdb.insertListView("Insert Name", "ex: Guido", "3");
		listdb.insertListView("Insert Surname", "ex: Rossi", "3");
		listdb.insertListView("Insert Email", "ex: guidorossi@gmail.com", "3");
		listdb.insertListView("Insert num Matricola", "123456", "3");
	}

	/**
	 * Popolo il ValuteDb quando esso è vuoto
	 */
	public void popolaValuteDB() {

		valutedb.insertValute("Euro", "EUR", 1, "0");
		valutedb.insertValute("United States Dollar", "USD", (float) 1.3315, "0");
		valutedb.insertValute("Pound sterling", "GBP", (float) 0.8313, "0");
		valutedb.insertValute("Japanese yen", "JPY", (float) 108.9833, "0");
		valutedb.insertValute("Australian dollar", "AUD", (float) 1.2848, "0");
		valutedb.insertValute("Brazilian real", "BRL", (float) 2.4342, "0");
		valutedb.insertValute("Canadian dollar", "CAD", (float) 1.3206, "0");
		valutedb.insertValute("Swiss franc", "CHF", (float) 1.2011, "0");
		valutedb.insertValute("Chinese yuan", "CNY", (float) 8.3781, "0");
		valutedb.insertValute("Czech koruna", "CZK", (float) 24.621, "0");
		valutedb.insertValute("Danish krone", "DKK", (float) 7.4404, "0");
		valutedb.insertValute("Hong Kong dollar", "HKD", (float) 10.3386, "0");
		valutedb.insertValute("Croatian kuna", "HRK", (float) 7.4933, "0");
		valutedb.insertValute("Hungarian forint", "HUF", (float) 293.8, "0");
		valutedb.insertValute("Indonesian rupiah", "IDR", (float) 12167.71, "0");
		valutedb.insertValute("Israeli new sheqel", "ILS", (float) 4.9558, "0");
		valutedb.insertValute("Indian rupee", "INR", (float) 67.514, "0");
		valutedb.insertValute("South Korean won", "KRW", (float) 1496.77, "0");
		valutedb.insertValute("Latvian lats", "LVL", (float) 0.7007, "0");
		valutedb.insertValute("Mexican peso", "MXN", (float) 16.9593, "0");
		valutedb.insertValute("Malaysian ringgit", "MYR", (float) 4.0607, "0");
		valutedb.insertValute("Norwegian krone", "NZD", (float) 1.6203, "0");
		valutedb.insertValute("Philippine peso", "PHP", (float) 56.791, "0");
		valutedb.insertValute("Polish zloty", "PLN", (float) 4.1357, "0");
		valutedb.insertValute("Romanian new leu", "RON", (float) 4.3775, "0");
		valutedb.insertValute("Russian rouble", "RUB", (float) 39.0237, "0");
		valutedb.insertValute("Swedish krona", "SEK", (float) 8.7938, "0");
		valutedb.insertValute("Singapore dollar", "SGD", (float) 1.6674, "0");
		valutedb.insertValute("Thai baht", "THB", (float) 41.037, "0");
		valutedb.insertValute("Turkish lira", "TRY", (float) 2.3677, "0");
		valutedb.insertValute("South African rand", "ZAR", (float) 10.2324, "0");

	}

}
// Fine dell'activity'